const capcity = 17.7;
const fileArr = [5.56, 4.86, 7.3, 3.4, 2.85, 6.7, 4.6, 2.1, 8.2, 5.4, 2.43, 5.43, 5.88, 4.22, 7.33, 4.65, 7.6, 10];
let lessThan = 0.2;
const map = {}
for (let i = 0; i < fileArr.length; i++) {
  const curr = fileArr[i];
  for (let j = 0; j < fileArr.length; j++) {
    // 不重复对比，比如i 和 j都是0，那就没必要计算，直接跳过
    if (j == i) continue;

    const plusRes = curr + fileArr[j];
    if (plusRes >= capcity) continue;

    // 如果直接找到最接近 capcity 值，且小于 lessThan 则记录并跳过，比如 10 + 7.6
    map[capcity - plusRes] = `${curr} + ${fileArr[j]}`
    if ((capcity - plusRes) < lessThan) continue;
    // console.log(curr, fileArr[j])
    // 如果大于 lessThan，则递归找出最匹配的值，比如 5.88 + 6.7 + 4.86 = 17.44
    const findDiff = test(capcity - plusRes);
    delete map[capcity - plusRes]
    // 将 " + " 替换掉
    map[capcity - plusRes - findDiff.total] = `${curr} + ${fileArr[j]} + ${findDiff.files}`.replace(/ \+ $/g, '')
  }
}
console.log(map)

function test(num){
  const mapObj = {}
  // 从文件数组中 找出小于给定值的文件
  for (const file of fileArr) {
    if (file < num) mapObj[num - file] = file
  }
  // 找出相差的最小值，比如给定的 num 是 5，那么相差最小的是 4.86，minDiff 就是 0.14
  const minDiff = Math.min(...Object.keys(mapObj))
  // console.log(num, mapObj[minDiff], minDiff)
  // 如果是空对象，那么想当于直接调用 Math.min，返回 Infinity
  // 如果相差值仍大于给定的 lessThan，递归调用
  if (minDiff != Infinity && minDiff > lessThan) {
    const temp = test(minDiff)
    return { total: mapObj[minDiff] + temp.total, files: `${mapObj[minDiff]} + ${temp.files}` }
  }
  // 如果最后实在找不出来了，返回 0
  if (minDiff == Infinity) return { total: 0, files: '' }
  // 如果找出的文件小于给定的 lessThan，则返回文件大小
  return { total: mapObj[minDiff], files: `${mapObj[minDiff]}` }
}